package com.jxpanda.commons.toolkit;

/**
 * @author Panda
 */
public class HexKit {

    private static final char[] HEX_CHARS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    private static final char[] HEX_CHARS_UPPER = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    /**
     * 把byte数组转为16进制字符串(默认大写输出的门面，要输出小写使用另外一个重载)
     *
     * @param bytes 字节数组
     * @return 转换后的16进制字符串
     */
    public static String toHex(byte[] bytes) {
        return toHex(bytes, false);
    }

    /**
     * 把byte数组转为16进制字符串
     *
     * @param bytes     字节数组
     * @param lowerCase 大小写标识，true的话输出小写，false输出大写
     * @return 转换后的16进制字符串
     */
    public static String toHex(byte[] bytes, boolean lowerCase) {
        StringBuilder hexBuilder = new StringBuilder();
        for (byte b : bytes) {
            // 取出高四位的值
            // 先把高四位通过右移操作拽到低四位
            int high = (b >> 4) & 0XF;
            // 取出低四位的值
            int low = b & 0XF;
            // 以high为下标从characters中取出对应的十六进制字符
            char highChar = lowerCase ? HEX_CHARS_LOWER[high] : HEX_CHARS_UPPER[high];
            // 以low为下标从characters中取出对应的十六进制字符
            char lowChar = lowerCase ? HEX_CHARS_LOWER[low] : HEX_CHARS_UPPER[low];
            hexBuilder.append(highChar).append(lowChar);
        }
        return hexBuilder.toString();
    }

}
